/**
 * 组件注册器：解析组件元数据并适配低代码平台
 */
import { markRaw } from 'vue';

export const ComponentRegistrar = {
  /**
   * 解析组件元数据
   * @param {Object} VueComponent - Vue组件对象
   * @returns {Object} 适配后的组件配置
   */
  parseMetadata(VueComponent) {
    if (!VueComponent.lowcode) {
      throw new Error('组件缺少低代码元数据（lowcode字段）');
    }
    const { meta, configPanel, events, actions } = VueComponent.lowcode;
    // 适配平台组件配置格式
    return {
      // 基础信息
      componentKey: meta.name,
      displayName: meta.displayName,
      description: meta.description,
      icon: meta.icon || 'fa-cube',
      category: meta.category || '内容展示',
      version: meta.version || '1.0.0',
      isContainer: meta.isContainer || false,
      component: markRaw(VueComponent), // 关联原始Vue组件

      // 配置面板（适配平台格式）
      configSchema: this._adaptConfigSchema(configPanel),

      // 事件定义
      events: events || [],

      // 动作定义
      actions: actions || [],

      // 默认属性（从组件props提取默认值）
      defaultProps: this._extractDefaultProps(VueComponent.props)
    };
  },

  /**
   * 适配配置面板格式
   * @param {Array} configPanel - 组件原始配置面板
   * @returns {Array} 适配后的配置 schema
   */
  _adaptConfigSchema(configPanel) {
    if (!configPanel) {
      return [];
    }
    return configPanel.map(panel => ({
      title: panel.title,
      fields: panel.fields.map(field => ({
        ...field,
        // 适配平台控件类型映射
        controlType: this._mapControlType(field.type),
        // 处理选项格式
        options: field.options || [],
        // 添加验证规则
        rules: this._createValidationRules(field)
      }))
    }));
  },

  /**
   * 控件类型映射
   * @param {String} fieldType - 组件字段类型
   * @returns {String} 平台控件类型
   */
  _mapControlType(fieldType) {
    const typeMap = {
      'color': 'color-editor',
      'select': 'enum-editor',
      'switch': 'boolean-editor',
      'image': 'image-editor',
      'boolean': 'boolean-editor',
      'number': 'number-editor',
      'text': 'string-editor',
      'array': 'array-editor',
      'object': 'object-editor'
    };
    return typeMap[fieldType] || 'string-editor';
  },
  /**
   * 创建验证规则
   * @param {Object} field - 字段配置
   * @returns {Array} 验证规则
   */
  _createValidationRules(field) {
    const rules = [];
    if (field.required) {
      rules.push({
        required: true,
        message: `${field.label}为必填项`,
        trigger: 'change'
      });
    }

    // 数字类型验证
    if (field.type === 'number') {
      if (field.min !== undefined) {
        rules.push({
          min: field.min,
          message: `${field.label}不能小于${field.min}`,
          trigger: 'change'
        });
      }
      if (field.max !== undefined) {
        rules.push({
          max: field.max,
          message: `${field.label}不能大于${field.max}`,
          trigger: 'change'
        });
      }
    }

    return rules;
  },

  /**
   * 从组件props提取默认值
   * @param {Object} props - 组件props定义
   * @returns {Object} 默认属性值
   */
  _extractDefaultProps(props) {
    const defaultProps = {};
    Object.keys(props).forEach(key => {
      const prop = props[key];
      // 处理函数形式的默认值（如数组/对象）
      if (prop.default !== undefined) {
        defaultProps[key] = typeof prop.default === 'function'
          ? prop.default()
          : prop.default;
      }
    });
    return defaultProps;
  },
  /**
   * 注册组件到平台
   * @param {Object} app - Vue实例
   * @param {Array} components - 待注册的组件数组
   */
  registerComponents(app, components) {
    console.log(`准备注册 ${components.length} 个组件`);
    components.forEach(component => {
      try {
        const parsedConfig = this.parseMetadata(component);
        // 全局注册Vue组件
        app.component(parsedConfig.componentKey, parsedConfig.component);
        // 注册到平台组件库（可存储到全局状态）
        window.lowcodeComponentLibrary = window.lowcodeComponentLibrary || [];
        window.lowcodeComponentLibrary.push(parsedConfig);
        console.log(`组件注册成功：${parsedConfig.displayName}`);
      } catch (error) {
        console.error(`组件注册失败：${component.name}`, error);
      }
    });
  },
  /**
   * 注册所有业务组件（同步方式）
   * @param {Object} app - Vue实例
   */
  registerAllBusinessComponentsSync(app) {
    // 使用 import.meta.globEager 进行同步导入
    const modules = import.meta.glob('../components/business/*.vue', { eager: true });
    
    const components = Object.values(modules);
    
    // 注册所有组件
    components.forEach(component => {
      try {
        const parsedConfig = this.parseMetadata(component.default || component);
        // 全局注册Vue组件
        app.component(parsedConfig.componentKey, parsedConfig.component);
        // 注册到平台组件库
        window.lowcodeComponentLibrary = window.lowcodeComponentLibrary || [];
        window.lowcodeComponentLibrary.push(parsedConfig);
      } catch (error) {
        console.error(`组件注册失败：${component.name}`, error);
      }
    });
  }
};
